home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / tex / finds101.zip / FINDSTR.C < prev    next >
Text File  |  1986-08-05  |  2KB  |  99 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. struct PatternStruct {
  5.     struct PatternStruct *Next;
  6.     char *Pattern;
  7.     int *d;
  8.     }
  9.  
  10. main (argc, argv)
  11. int argc;
  12. char *argv[];
  13. {     
  14.     extern int BMSearch(), BMSearchI();
  15.     extern void BMCompile(), BMCompileI();
  16.     char *malloc();
  17.  
  18.     struct {
  19.         struct PatternStruct *Head, *Current;
  20.         }
  21.     PatQueue;
  22.  
  23.     char Line[256], Pattern[81], FileName[68];
  24.     int lnno, sl, pl, p, i, fp;
  25.     int d[256];
  26.     FILE *F1;
  27.     struct PatternStruct *t;
  28.  
  29.     int (* Search) ();
  30.     void (* Compile) ();
  31.  
  32.     fprintf(stderr, "FINDSTR Version 1.01: August 5, 1986\n\n");
  33.     Search = BMSearchI; Compile = BMCompileI;
  34.  
  35.     for (i=1; i<argc; i++) {
  36.         if (argv[i][0] == '-') {
  37.             switch (toupper(argv[i][1])) {
  38.                 case 'C':
  39.                     Search = BMSearch; Compile = BMCompile;
  40.                     break;
  41.                 default:
  42.                     fprintf(stderr, "Invalid option: %s\n", argv[i]);
  43.                     exit(1);
  44.                     break;
  45.                 }
  46.             }
  47.         }
  48.     PatQueue.Head = PatQueue.Current = (struct PatternStruct *) NULL;
  49.     fprintf(stderr, "Enter search patterns, 1 per line\n");
  50.     fprintf(stderr, "NULL line terminates\n");
  51.     while (fgets(Pattern, 80, stdin)) {
  52.         pl = strlen(Pattern); 
  53.         Pattern[--pl] = 0x00;
  54.         if (pl == 0) break;
  55.         t = (struct PatternStruct *) malloc(sizeof(struct PatternStruct));
  56.         if (t == NULL) {
  57.             fprintf(stderr, "Insufficient memory for pattern: %s\n", Pattern);
  58.             continue;
  59.             }
  60.         t->Pattern = malloc(pl+1);
  61.         if (t->Pattern == 0) {
  62.                         fprintf(stderr, "Insufficient memory for pattern: %s\n", Pattern);
  63.             continue;
  64.             }
  65.         t->d = (int *) malloc(256 * sizeof(int));
  66.         if (t->d == 0) {
  67.             fprintf(stderr, "Insufficient memory for pattern: %s\n", Pattern);
  68.             continue;
  69.             }
  70.         strcpy(t->Pattern, Pattern);
  71.         (* Compile) (Pattern, pl, t->d);
  72.         t->Next = NULL;
  73.         if (PatQueue.Head == NULL) PatQueue.Head = t;
  74.         else PatQueue.Current->Next = t;
  75.         PatQueue.Current = t;
  76.         }
  77.     for (fp=1; fp<argc; fp++) {
  78.         if (argv[fp][0] == '-') continue;
  79.         if ((F1 = fopen(argv[fp], "r")) == 0) {
  80.             fprintf(stderr, "Can't find file: %s\n", argv[fp]);
  81.             continue;
  82.             }
  83.         printf("--%s--\n", argv[fp]);
  84.         lnno = 0;
  85.         while (fgets(Line, 255, F1)) {
  86.             sl = strlen(Line); 
  87.             Line[--sl] = 0x00;
  88.             lnno++;
  89.             for (t=PatQueue.Head; t != NULL; t = t->Next) {
  90.                 if ((p = (* Search) (Line, sl, t->Pattern, strlen(t->Pattern),
  91.                         t->d)) >= 0) {
  92.                     printf("%s %4d: %s\n", t->Pattern, lnno, Line);
  93.                     }
  94.                 }
  95.             }
  96.         fclose(F1);
  97.         }
  98.     }
  99.